<?php
namespace App\Library\SmsGateway;

use App\Library\App;
use App\Library\Helper;
use App\Library\Http;

class Yunpian {

    private $gateway = 'http://yunpian.com/v1/sms/send.json';

    public function __construct() {
    }

    public function mt($mobile, $content) {

        $apikey = '1342b1e2542479d1ac1355a605931429';

        $data = [
            'apikey' => $apikey,
            'mobile' => urlencode($mobile),
            'text'   => ($content)
        ];

        $http   = new Http();
        $retMsg = $http->request($this->gateway, 'POST', $data);
        if($retMsg == '') {
            //$retMsg = $http->request($this->gateway, 'POST', $data);//重试一次
            if($retMsg == '') {
                return [
                    'status'      => Adapter::ERROR,
                    'status_msg'  => Adapter::ERROR_MESSAGE,
                    'gateway_msg' => '网关没有响应',
                    'send_at'     => Helper::getNow()
                ];
            }
        }
        /**
         * {
         * "code": 0,
         * "msg": "OK",
         *  "result": {
         *    "count": 1,   //成功发送的短信个数
         *    "fee": 1,     //扣费条数，70个字一条，超出70个字时按每67字一条计
         *    "sid": 1097   //短信id；多个号码时以该id+各手机号尾号后8位作为短信id （数据类型：64位整型，对应Java和C#的long，不可用int解析)
         *  }
         * }
         */
        $ret = json_decode($retMsg, true);
        if(isset($ret['code'])) {
            if($ret['code'] == 0) {
                return [
                    'status'      => Adapter::SUCCESS,
                    'status_msg'  => Adapter::SUCCESS_MESSAGE,
                    'gateway_msg' => $retMsg,
                    'send_at'     => Helper::getNow()
                ];
            } else {
                //App::Logger()->error(sprintf("调用YUNPIAN API 失败，mobile=%s&content=%s&ret=%s&reson=%s", $mobile, $content, $retMsg, $this->error($ret['code'])));
                if($ret['code'] == '5') {
                    App::Logger()->error(sprintf("调用YUNPIAN API 失败，mobile=%s&content=%s&ret=%s&reson=%s", $mobile, $content, $retMsg, $this->error($ret['code'])));
                    $http->request($this->gateway, 'POST', [
                        'apikey' => $apikey,
                        'mobile' => '18610188165',
                        'text'   => '【美赞臣】发现有未申请备案的模板，请立即登陆处理！'
                    ]);
                    $http->request($this->gateway, 'POST', [
                        'apikey' => $apikey,
                        'mobile' => '13718332793',
                        'text'   => '【美赞臣】发现有未申请备案的模板，请立即登陆处理！'
                    ]);
                    $http->request($this->gateway, 'POST', [
                        'apikey' => $apikey,
                        'mobile' => '18628056586',
                        'text'   => '【美赞臣】发现有未申请备案的模板，请立即登陆处理！'
                    ]);
                }
                return [
                    'status'      => Adapter::ERROR_GATEWAY,
                    'status_msg'  => Adapter::ERROR_GATEWAY_MESSAGE,
                    'gateway_msg' => $retMsg . '(' . $this->error($ret['code']) . ')',
                    'send_at'     => Helper::getNow()
                ];
            }
        } else {
            //App::Logger()->error(sprintf("调用YUNPIAN API 失败，mobile=%s&content=%s返回%s", $mobile, $content, $retMsg));
            return [
                'status'      => Adapter::ERROR_GATEWAY,
                'status_msg'  => Adapter::ERROR_GATEWAY_MESSAGE,
                'gateway_msg' => $retMsg,
                'send_at'     => Helper::getNow()
            ];
        }
    }

    /**
     * 0    OK
     * 1    请求参数缺失
     * 2    请求参数格式错误
     * 3    账户余额不足
     * 4    关键词屏蔽
     * 5    未找到对应id的模板
     * 6    添加模板失败
     * 7    模板不可用
     * 8    同一手机号30秒内重复提交相同的内容
     * 9    同一手机号5分钟内重复提交相同的内容超过3次
     * 10   手机号黑名单过滤
     * 11   接口不支持GET方式调用
     * 12   接口不支持POST方式调用
     * 13   营销短信暂停发送
     * 14   解码失败
     * 15   签名不匹配
     * 16   签名格式不正确
     * 17   24小时内同一手机号发送次数超过限制
     * -1   非法的apikey
     * -2   API没有权限
     * -3   IP没有权限
     * -4   访问次数超限
     * -5   访问频率超限
     * -50  未知异常
     * -51  系统繁忙
     * -52  充值失败
     * -53  提交短信失败
     * -54  记录已存在
     * -55  记录不存在
     * -57  用户开通过固定签名功能，但签名未设置
     *
     * @param $k
     *
     * @return bool
     */
    private function error($k) {
        $retMessages = [
            '0'   => 'OK',
            '1'   => '请求参数缺失',
            '2'   => '请求参数格式错误',
            '3'   => '账户余额不足',
            '4'   => '关键词屏蔽',
            '5'   => '未找到对应id的模板',
            '6'   => '添加模板失败',
            '7'   => '模板不可用',
            '8'   => '同一手机号30秒内重复提交相同的内容',
            '9'   => '同一手机号5分钟内重复提交相同的内容超过3次',
            '10'  => '手机号黑名单过滤',
            '11'  => '接口不支持GET方式调用',
            '12'  => '接口不支持POST方式调用',
            '13'  => '营销短信暂停发送',
            '14'  => '解码失败',
            '15'  => '签名不匹配',
            '16'  => '签名格式不正确',
            '17'  => '24小时内同一手机号发送次数超过限制',
            '-1'  => '非法的apikey',
            '-2'  => 'API没有权限',
            '-3'  => 'IP没有权限',
            '-4'  => '访问次数超限',
            '-5'  => '访问频率超限',
            '-50' => '未知异常',
            '-51' => '系统繁忙',
            '-52' => '充值失败',
            '-53' => '提交短信失败',
            '-54' => '记录已存在',
            '-55' => '记录不存在',
            '-57' => '用户开通过固定签名功能，但签名未设置'
        ];
        if(isset($retMessages[$k])) {
            return $retMessages[$k];
        }
        return false;
    }
}
